package com.example.demo.web.filter;


import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletResponse;

import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.AccessControlFilter;
import org.apache.shiro.web.util.WebUtils;
import org.springframework.util.StringUtils;

/**
 * 访问控制类
 * <p>@author Henry.Y</p>
 * <p>@date 2019-08-02</p>
 */
public class AnyRolesFilter extends AccessControlFilter{

	private String unauthorizedUrl="/unauthorized.jsp";
	
	private String loginUrl= "/login.jsp";
	
	/**
	 * 是否允许访问
	 * @param request 客户请求
	 * @param response 服务器响应
	 * @param mappedValue 地址
	 * @return 是否允许访问
	 */
	protected boolean isAccessAllowed(ServletRequest request,ServletResponse response,Object mappedValue)throws Exception{
		String[] roles= (String[])mappedValue;
		if(null==roles){
			
			return true;           //如果没有角色参数，默认成功
		}
		for(String role:roles){
			if(getSubject(request,response).hasRole(role)){
				return true;
			}
		}
		return false;              //跳转到onAccessDefined处理
	}
	
	/**
	 * 表示当前拒绝访问是否已经处理了,true需要继续处理,false表示已经处理了
	 * @param request 客户请求
	 * @param response 客户响应
	 */
	protected boolean onAccessDenied(ServletRequest request,ServletResponse response)throws Exception{
		Subject subject= getSubject(request,response);
		if(null==subject.getPrincipal()){              //表示没有登陆,重定向登陆界面
			saveRequest(request);
			WebUtils.issueRedirect(request, response, loginUrl);
		}else{
			if(StringUtils.hasText(unauthorizedUrl)){  //如果有未授权界面,直接跳转过去
				WebUtils.issueRedirect(request, response, unauthorizedUrl);
			}else{                                     //否则返回401界面
				WebUtils.toHttp(response).sendError(HttpServletResponse.SC_UNAUTHORIZED);
			}
		}
		return false;
	}
}
